{***************************************************************
    SpyGestion  Copyright (C) 2008 Christophe KOALI <nature2gas@gmail.com>
    
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
****************************************************************}
unit modParsingClassIFlotte4;

interface

uses modParsingClassBase,
     modBaseType,
     Classes,
     sFonctionsChaines,
     SysUtils,
     Windows,

     LibXmlParser;





type

    ////////////////////////////////////////////////////////////////////
    // Page flotte 4, confirmation d'envoi
    TParsingFlotte4_ContentNextIs = (pf4Neant, pf4Depart, pf4Arrivee, pf4Consomation, pf4Vitesse, pf4Distance);
    TParsingFlotte4_ConfirmationEnvoi = class(IParsingRedirection)
    private
       //
       // Informations qui vont être extraites
       //

        FFlotteDepart : TPlanetLocation;
        FFlotteArrivee: TPlanetLocation;

        FFlotteConsomation: integer;
        FFlotteVitesse: integer;
        FFlotteDistance: integer;

        // Si la planète n'existe plus
        FPlaneteDestinationVide : boolean;

        // Si la planète a la protection des noob
        FPlaneteDestinationNoobProtect: boolean;
        FPlaneteIsInModeVacance : boolean;
        FPlaneteAdmin: boolean;
        FDeuteriumError: boolean;  // besoin de plus de deutérium


        // Quand il y a une erreur, un message global aux erreurs est aussi présent
        // cette variable indique si ce message global d'erreur existe
        FGeneralError: boolean;

        
        // Inutile à présent (depuis la 0.77) car on ne parse uniquement le div de
        // contenu
        //FBaliseFinHTMLTrouve: boolean;


       //
       // Variables qui vont aider à se repérer dans la page
       //


        FInTable: boolean;
        FCurrTableLigne  : integer;
        FCurrTableColonne: integer;

        FNextContent: TParsingFlotte4_ContentNextIs;



        // Renvoi  FPlaneteDestinationVide or FPlaneteDestinationNoobProtect
        function GetPlaneteCantBeAccessible: boolean;
        
    public

        property FlotteDepart : TPlanetLocation read FFlotteDepart;
        property FlotteArrivee: TPlanetLocation read FFlotteArrivee;

        property IsPlaneteVide: boolean     read FPlaneteDestinationVide;
        property IsPlaneteProtectNoob: boolean     read FPlaneteDestinationNoobProtect;
        property IsPlaneteModeVacance: boolean    read FPlaneteIsInModeVacance;

        property IsDeuteriumError: boolean read FDeuteriumError;

        // Définit si cette planète peut être accessible (c'est à dire que si
        // l'envoi à échoué par manque de deutérium, cette propriété sera à false)
        property IsPlaneteCantBeAccessible: boolean read GetPlaneteCantBeAccessible;

        property GeneralErreur: boolean read FGeneralError;


        // "A cause de la protection des noobs tu ne peux pas espionner cette planète!"

        property FlotteConsomation: integer read FFlotteConsomation;
        property FlotteVitesse: integer read FFlotteVitesse;
        property FlotteDistance: integer read FFlotteDistance;





       /////////////////////////////////////////////////////////////////////////
       // Implémentation de IParsingRedirection

        // initialise l'interface
        procedure Initialisation; override;

        // obtient le résultat d'analyse
        function  GetFinalState: TParsingResultState; override;

        procedure SetFullURLFromBase(const BaseLink: string); override;


        procedure ScanOnStartTag(Sender: TObject; TagName: string; Attributes: TAttrList); override;
        procedure ScanOnEndTag(Sender: TObject; TagName: string); override;
        procedure ScanOnContent(Sender: TObject; Content: string); override;

       //
       /////////////////////////////////////////////////////////////////////////

    end;


     
implementation


uses modLanguageParsing,
     sHTMLFonctions,
     modApercuMsg,
     ESBDates,
     modCore;


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// Flotte 4 - Confirmation d'envoi

procedure TParsingFlotte4_ConfirmationEnvoi.SetFullURLFromBase(const BaseLink: string);
begin
    // rien à faire
    inherited ;
end;

procedure TParsingFlotte4_ConfirmationEnvoi.Initialisation;
begin

    inherited;


       //
       // Informations qui vont être extraites
       //


    with FFlotteDepart do begin
        Galaxie := -1;
        SystemSolaire := -1;
        Position := -1;
    end;
    with FFlotteArrivee do begin
        Galaxie := -1;
        SystemSolaire := -1;
        Position := -1;
    end;

    FFlotteConsomation := -1;
    FFlotteVitesse     := -1;
    FFlotteDistance    := -1;

    FPlaneteDestinationVide := false;

    FPlaneteDestinationNoobProtect := false;
    FPlaneteIsInModeVacance := false;
    FPlaneteAdmin := false;
    FDeuteriumError := false;

    FGeneralError := false;

    
       //
       // Variables qui vont aider à se repérer dans la page
       //

    FInTable := false;
    FNextContent := pf4Neant;

    FCurrTableLigne := 0;
    FCurrTableColonne := 0;

end;

function TParsingFlotte4_ConfirmationEnvoi.GetFinalState: TParsingResultState;
begin
    Result := PRESULT_ECHEC;


    if (FPlaneteDestinationVide = false) and (FPlaneteDestinationNoobProtect = false) and
       (FPlaneteIsInModeVacance = false) and (FPlaneteAdmin = false) and (FDeuteriumError = false) then begin

       if FFlotteDepart.Position < 1 then
          FError := true;

       if FFlotteArrivee.Position < 1 then
          FError := true;

    end;

    if FError then begin
       exit;
    end;

    Result := NoT(PRESULT_ECHEC);
end;


procedure TParsingFlotte4_ConfirmationEnvoi.ScanOnStartTag(Sender: TObject; TagName: string; Attributes: TAttrList);
var CurrBalise: string;
begin

    TagName := lowercase(TagName);

    if TagName = 'table' then begin

        FInTable := true;
        FNextContent := pf4Neant;
        FCurrTableLigne   := 0;  // integer;
        FCurrTableColonne := 0;  // integer;

    end else if TagName = 'tr' then begin
        Inc(FCurrTableLigne);
        FCurrTableColonne := 0;

    end else if (TagName = 'td') or (TagName = 'th') then begin
        Inc(FCurrTableColonne);

    end;


end;

procedure TParsingFlotte4_ConfirmationEnvoi.ScanOnEndTag(Sender: TObject; TagName: string);
begin

    TagName := lowercase(TagName);

    if TagName = 'table' then begin
       FInTable := false;

    end else if SameText(TagName, 'html') then begin
       // permet de s'assurer que la page web a bien été téléchargé en cas d'erreur de parsing
       // Useless depuis la version 0.77 car un gestionnaire de couche supérieur s'en charge
       //FBaliseFinHTMLTrouve := true;
    end;


end;

procedure TParsingFlotte4_ConfirmationEnvoi.ScanOnContent(Sender: TObject; Content: string);
var sContent: string;
begin


   sContent := trim(lowercase(Content));




   // Erreur commune à toutes les erreurs
   if pos(LangParsing.GetData('flotte4_erreur_lwpos_pas_envoye', 'a pas pû être envoyée'), sContent) > 0 then begin
      // La flotte n'a pas pû être envoyée !
      FGeneralError := true;
   end;

   // Multi-alarm! Player can't be approached with fleet!


   
   if SameText(Content, 'admin') then begin
      // La flotte n'a pas pû être envoyée !
      // Admin
      FPlaneteAdmin := true;

   end else if pos(LangParsing.GetData('flotte4_erreur_lwpos_planete_non_habite', 'planète inhabité'), sContent) > 0 then begin
      // 0.70: planète inhabité
      // Planète inhabité ou planète habité et en cour d'être colonisé!
      FPlaneteDestinationVide := true;

   end else if pos(LangParsing.GetData('flotte4_erreur_lwpos_deuterium_need', 'as assez de carburant'), sContent) > 0 then begin
      // Pas assez de carburant !
      FDeuteriumError := true;

      
   end else if pos(LangParsing.GetData('flotte4_erreur_lwpos_protect_des_noob', 'protection des joueurs faibles'), sContent) > 0 then begin
      // 0.70: protection des noobs
      // Vous ne pouvez pas espionner cette planète, la protection des joueurs faibles vous en empêche !
      // This planet can't be approached because of newbie protection!
      FPlaneteDestinationNoobProtect := true;


   end else if pos(LangParsing.GetData('flotte4_erreur_lwpos_en_vacance', 'joueur est en mode vacance'), sContent) > 0 then begin
      // 0.70: joueur est en mode vacance
      FPlaneteIsInModeVacance := true;


   end else if pos(LangParsing.GetData('flotte4_swiss_neutral', 'witzerland is neutral'), sContent) > 0 then begin
      // Uni béta: la suisse est neutre
      // Switzerland is neutral
      // avec le message:
      // No ships selected or not enough ships available!
      FPlaneteDestinationNoobProtect := true;


   end;


   // A cause de la protection des noobs tu ne peux pas espionner cette planète!


   if FInTable = false then exit;
   if FCurrTableLigne < 2 then exit;


   // FFlotteArriveeIsInvalide

   if FCurrTableColonne = 1 then begin










      // On est dans la page de confirmation d'envoi
      // Et on extrait les champs pour être certain d'avoir
      // reussi l'envoi de la flotte


      if SameText(Content, LangParsing.GetData('flotte4_so_Ordre', 'Ordre')) then begin
         FNextContent := pf4Neant;
      end else if SameText(Content, LangParsing.GetData('flotte4_st_Distance', 'Distance')) then begin
         FNextContent := pf4Distance;
      end else if SameText(Content, LangParsing.GetData('flotte4_st_Vitesse', 'Vitesse')) then begin
         FNextContent := pf4Vitesse;
      end else if SameText(Content, LangParsing.GetData('flotte4_st_Consommation', 'Consommation')) then begin
         FNextContent := pf4Consomation;
      end else if SameText(Content, LangParsing.GetData('flotte4_st_Depart', 'Départ')) then begin
         FNextContent := pf4Depart;
      end else if SameText(Content, LangParsing.GetData('flotte4_st_Objectif', 'Objectif')) then begin
         FNextContent := pf4Arrivee;

      end else if SameText(Content, LangParsing.GetData('flotte4_st_TempsArrivée', 'Temps d''arrivée')) then begin
         // ignore, les autres champs suffissent pour savoir si on a reussit l'envoi
         FNextContent := pf4Neant;
      end else if SameText(Content, LangParsing.GetData('flotte4_st_TempsRetour', 'Temps de retour')) then begin
         FNextContent := pf4Neant;
      end;




   end else if FCurrTableColonne = 2 then begin
       if FNextContent = pf4Neant then exit;

       Content := trim(Content);

       case FNextContent of
           pf4Distance   : FFlotteDistance    := StrToIntDef(Content, -1);
           pf4Vitesse    : FFlotteVitesse     := StrToIntDef(Content, -1);
           pf4Consomation: FFlotteConsomation := StrToIntDef(Content, -1);

           pf4Depart : FFlotteDepart  := mpcExtractPlanetLocation(Content);
           pf4Arrivee: FFlotteArrivee := mpcExtractPlanetLocation(Content);
       end;

       // Réinitialise le flag
       FNextContent := pf4Neant;
   end;

end;

function TParsingFlotte4_ConfirmationEnvoi.GetPlaneteCantBeAccessible: boolean;
begin
    Result := false;

    if FPlaneteDestinationVide or FPlaneteAdmin or FPlaneteDestinationNoobProtect or
       FPlaneteIsInModeVacance or FGeneralError then
       Result := true;

end;





end.
